package com.sreManager.controller.web;

import java.net.UnknownHostException;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;

import javax.validation.Valid;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import com.sreManager.Constant;
import com.sreManager.controller.DefaultAjaxController;
import com.sreManager.domain.Users;
import com.sreManager.mapper.CompanyBuildingMapper;
import com.sreManager.mapper.UsersMapper;
import com.sreManager.service.BuildingService;
import com.sreManager.web.util.CommonUtil;

/*
 * 관리자 업무 사용자 관리 컨트롤러
 */
@Controller
@RequestMapping(value={"/"})
public class AJaxController extends DefaultAjaxController {

    @Autowired UsersMapper usersMapper;
	@Autowired CompanyBuildingMapper buildingMapper;
	@Autowired BuildingService buildingService;

	/**
	 * 사용자 기본 정보를 호출한다.
	 * @return 사용자 기본 정보
     * @throws UnknownHostException
	 */
    @RequestMapping(value="allSearch")
	public @ResponseBody HashMap<String, Object> allSearchAjax(@RequestParam HashMap<String, Object> paramMap) {
    	HashMap<String, Object> map = new HashMap<String, Object>();
    	try{
	    	map.put("list", buildingMapper.selectBuildingList(paramMap));
		}catch (Exception e) {
			log.error("Exception : ", e);
		}

    	return map;
	}
    /**
	 * 사용자 기본 정보를 호출한다.
	 * @return 사용자 기본 정보
     * @throws UnknownHostException
	 */
    @RequestMapping(value="user/infoAJax")
	public @ResponseBody HashMap<String, Object> infoAJax(@ModelAttribute Users users, @RequestParam(required=false) String logMsg) throws UnknownHostException {
    	HashMap<String, Object> map = new HashMap<String, Object>();
    	try{
	    	map.put("userInfo", usersMapper.selectUsers(users));
		}catch (Exception e) {
			log.error("Exception : ", e);
		}

		// 로그
		logsService.insertLog(request, Constant.LOG_TYPE_VIEW, Constant.MENU_USER, logMsg);

    	return map;
	}

	/**
	 * 관리자 업무 사용자를 등록힌다
	 * @return 관리자 업무 사용자 등록
	 */
    @RequestMapping(value="user/addAJax")
	public @ResponseBody Map<String, Object> UserAddAjax(@Valid Users user, BindingResult result, Locale locale, @RequestParam(required=false) String logMsg) {

    	Map<String, Object> map = new HashMap<String, Object>();
        if (validtion(map, result, locale) == false) {
            return map;
        }
		try {
			Users users = new Users();
    		users.setUserId(user.getUserId());
    		if(usersMapper.selectUsers(users)!=null){
    	    	map.put(Constant.CODE_KEY, Constant.ERROR_DB);
                map.put(Constant.MESSAGE_KEY, msg.getMessage("exsist.id", null, locale));
    		}else {
    			user.setUserPwd(CommonUtil.encryptPassword(user.getUserPwd()));
    			// 기관ID = 로그인 한 사람 기준.
        		map = doResult(map, usersMapper.insertUsers(user), locale);
    	    	int CODE_KEY = (Integer) map.get(Constant.CODE_KEY);
    	    	if(CODE_KEY==Constant.OK){
    	        	map.put("userInfo", usersMapper.selectUsers(user));
    	    	}
    		}

    		// 로그
    		logsService.insertLog(request, Constant.LOG_TYPE_REG, Constant.MENU_USER, logMsg);

    	} catch (Exception e) {
	    	map.put(Constant.CODE_KEY, Constant.ERROR_DB);
            map.put(Constant.MESSAGE_KEY, msg.getMessage("error.db", null, locale));
			log.error("Exception : ", e);
		}
    	return map;
	}
    
    /**
	 * 데이터 전체 삭제한다
	 * @return 데이터 전체 삭제
	 */
    @RequestMapping(value="data/delAJax")
	public @ResponseBody Map<String, Object> uploadDelAjax(Locale locale) {

    	Map<String, Object> map = new HashMap<String, Object>();
        
		try {
			buildingService.deleteAllData();

	    	map.put(Constant.CODE_KEY, Constant.OK);

            // 로그
			logsService.insertLog(request, Constant.LOG_TYPE_DEL, Constant.MENU_UPLOAD, "데이터를 전체 삭제했습니다.");
			
		} catch (UnknownHostException e) {
	    	map.put(Constant.CODE_KEY, Constant.ERROR_DB);
            map.put(Constant.MESSAGE_KEY, msg.getMessage("error.db", null, locale));
		}
    	return map;
	}
    
	/**
	 * 사용자를 수정한다
	 * @return 사용자 수정
	 */
    @RequestMapping(value="user/modAJax")
	public @ResponseBody Map<String, Object> UserModAjax(@Valid Users user, BindingResult bind, Locale locale, @RequestParam(required=false) String logMsg) {
    	Map<String, Object> map = new HashMap<String, Object>();
        if (validtion(map, bind, locale) == false) {
            return map;
        }

		try {
			// 사용자 확인
			Users users = new Users();
			users.setUserId(user.getUserId());
			users = usersMapper.selectUser(user);
			if (users == null) {
    	    	map.put(Constant.CODE_KEY, Constant.ERROR_DB);
                map.put(Constant.MESSAGE_KEY, msg.getMessage("notexsist.id", null, locale));
            	return map;
	        }

        	// 패스워드 확인
			String inputPwd = CommonUtil.encryptPassword(user.getUserPwd());
			if(StringUtils.equals(users.getUserPwd(), inputPwd) == false){
    	    	map.put(Constant.CODE_KEY, Constant.ERROR_DB);
                map.put(Constant.MESSAGE_KEY, msg.getMessage("notequal.pwd", null, locale));
            	return map;
	        }

			// 업데이트
			if(user.getNewUserPwd()!=null && !user.getNewUserPwd().equals("")){
				user.setNewUserPwd(CommonUtil.encryptPassword(user.getNewUserPwd()));
			}

			map =  doResult(map, usersMapper.updateUsers(user), locale);
	    	int CODE_KEY = (Integer) map.get(Constant.CODE_KEY);
	    	if(CODE_KEY==Constant.OK){
	        	map.put("userInfo", usersMapper.selectUsers(user));
	    	}

    		// 로그
    		logsService.insertLog(request, Constant.LOG_TYPE_MOD, Constant.MENU_USER, logMsg);

		} catch (Exception e) {
	    	map.put(Constant.CODE_KEY, Constant.ERROR_DB);
            map.put(Constant.MESSAGE_KEY, msg.getMessage("error.db", null, locale));
			log.error("Exception : ", e);
		}

    	return map;
	}

	/**
	 * 사용자를 삭제한다
	 * @return 사용자 삭제
	 */
    @RequestMapping(value="user/delAJax")
	public @ResponseBody Map<String, Object> UserDelAjax(@Valid Users user, BindingResult bind, Locale locale, @RequestParam(required=false) String logMsg) {
    	Map<String, Object> map = new HashMap<String, Object>();
        if (validtion(map, bind, locale) == false) {
            return map;
        }
		try {
	    	map = doResult(map, usersMapper.deleteUsers(user), locale);

    		// 로그
    		logsService.insertLog(request, Constant.LOG_TYPE_DEL, Constant.MENU_USER, logMsg);

		} catch (Exception e) {
	    	map.put(Constant.CODE_KEY, Constant.ERROR_DB);
	        map.put(Constant.MESSAGE_KEY, msg.getMessage("error.db", null, locale));
			log.error("Exception : ", e);
		}
		return map;
	}
}
